#include <iostream>
#include <signal.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>

using namespace std;

// 如果我们不想等待子进程,并且我们还想让子进程退出之后,自动释放僵尸子进程
int main()
{
    // OS 默认就是忽略的
    signal(SIGCHLD, SIG_IGN); // 手动设置对子进程进行忽略

    if(fork() == 0)
    {
        cout << "child: " << getpid() << endl;
        sleep(5);
        exit(0);
    }

    while(true)
    {
        cout << "parent: " << getpid() << " 执行我自己的任务!" << endl;
        sleep(1);
    }
}


// void handler(int sig)
// {
//     pid_t id;
//     while ((id = waitpid(-1, nullptr, WNOHANG)) > 0)
//     {
//         printf("wait child success: %d\n", id);
//     }
//     printf("child is quit! %d\n", getpid());
// }

// int main()
// {
//     signal(SIGCHLD, handler);
//     if (fork() == 0)
//     { // child
//         printf("child : %d\n", getpid());
//         sleep(3);
//         exit(1);
//     }
//     while (1)
//     {
//         printf("father proc is doing some thing!\n");
//         sleep(1);
//     }
//     return 0;
// }

// #include <iostream>
// #include <unistd.h>
// #include <signal.h>

// using namespace std;

// void handler(int signum)
// {
//     cout << "子进程退出: " << signum << " father: " << getpid() << endl;
// }

// // 证明:子进程退出,会向父进程发送信号
// int main()
// {
//     signal(SIGCHLD, handler);
//     if(fork() == 0)
//     {
//         cout << "child pid: " << getpid() << endl;
//         sleep(1);
//         exit(0);
//     }

//     while(true) sleep(1);

// }

// volatile int flag = 0;

// void changeFlag(int signum)
// {
//     (void)signum;
//     cout << "flag: " << flag << endl;
//     flag = 1;
//     cout << "flag: " << flag << endl;
// }

// int main()
// {
//     signal(2, changeFlag);
//     while(!flag);
//     cout << "进程正常退出后: " << flag << endl;
// }

// void showPending(sigset_t* pending)
// {
//     for(int i = 31; i >= 1; --i)
//     {
//         if(sigismember(pending, i)) cout << '1';
//         else cout << '0';
//     }
//     cout << endl << "----------------" << endl;
// }

// void handler(int signum)
// {
//     cout << "捕捉到了一个信号: " << signum << endl;
//     cout << "捕捉到了一个信号: " << signum << endl;
//     cout << "捕捉到了一个信号: " << signum << endl;
//     // 验证2号信号被捕捉期间,再次发送2号信号不会去处理

//     sigset_t pending;
//     int c = 7;
//     while(1)
//     {
//         sigpending(&pending);
//         showPending(&pending);
//         --c;
//         if(!c)  break;
//         sleep(1);
//     }
// }

// int main()
// {
//     // 一下内核数据结构变量是在用户栈定义的
//     // 需要将它们设置进进程的内核中
//     cout << "id:" << getpid() << endl;
//     struct sigaction act, oldact;
//     act.sa_flags = 0;   // 实时信号的标记位
//     sigemptyset(&act.sa_mask);
//     act.sa_handler = handler;

//     // 处理2号信号期间,3 4 5 6 7号信号也被block
//     sigaddset(&act.sa_mask, 3);
//     sigaddset(&act.sa_mask, 4);
//     sigaddset(&act.sa_mask, 5);
//     sigaddset(&act.sa_mask, 6);
//     sigaddset(&act.sa_mask, 7);

//     // 设置进当前进程的PCB中
//     sigaction(SIGINT, &act, &oldact);

//     cout << "default action: " << (int)(oldact.sa_handler) << endl;

//     while(true) sleep(1);
//     return 0;
// }